package annotation05;

import org.junit.Test;

import java.lang.reflect.Method;

/**
 * 获取类上和方法上的注解
 * Class类中的方法:
 *  boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
 *           判断该类上是否有指定的注解,如果有返回true,否则返回false
 *  public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
 *         获取该类上指定的注解
 * Method类中:
 *  public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
 *   判断该方法上是否有指定的注解,如果有返回true,否则返回false
 *  public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
 *     获取该方法上指定的注解
 */
public class Demo {
    @Test
    public void testGetClassAnnotation(){
        // 1.获取Person类字节码对象
        Class<Person> personClass = Person.class;
        //2.判断该类上是否有该注解，如果有在获取，没有什么都不动
        boolean flag = personClass.isAnnotationPresent(MyAnnotation.class);
        // 3.判断flag，如果flag为真再去获取注解
        if(flag){
            //4.获取注解
            MyAnnotation annotation = personClass.getAnnotation(MyAnnotation.class);
            // 5.获取当前注解上属性值
            System.out.println(annotation.name());
            System.out.println(annotation.num());
            for (String color : annotation.colors()) {
                System.out.println(color);
            }
        }
    }
    @Test
    public void testGetMethodAnnotation() throws Exception {
        // 1.获取Person类字节码对象
        Class<Person> personClass = Person.class;
        //2.判断该方法上是否有该注解，如果有在获取，没有什么都不动
        Method method = personClass.getMethod("getAge");
        if (method.isAnnotationPresent(MyAnnotation.class)) {
            //3.获取方法上的注解
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
            // 4.获取注解上的属性值
            System.out.println(annotation.name());
            System.out.println(annotation.num());
            for (String color : annotation.colors()) {
                System.out.println(color);
            }
        }
    }
}
